package com.mixsmart.web.plugins.ztree;

import java.util.ArrayList;
import java.util.List;

import com.mixsmart.enums.YesNoType;
import com.mixsmart.utils.StringUtils;
import com.mixsmart.web.plugins.bean.ZTreeData;

/**
 * 用于数组对象列表转换为zTree对象列表的抽象类
 * @author 李湄强
 * @version 1.0
 * @since 1.0
 * <br />
 * 创建日期：2016年5月29日
 */
public abstract class AbsObj2zTree {

	/**
	 * 转换成zTree树形结构的数据格式
	 * @param trees 树形数据列表
	 * @param isAsync 是否异步加载
	 * @return 返回zTree数据对象列表
	 */
	public final List<ZTreeData> convert(List<Object> trees, boolean isAsync) {
		List<ZTreeData> zTreeDatas = null;
		if(null != trees && trees.size()>0) {
			ZTreeData zTreeData = null;
			zTreeDatas = new ArrayList<ZTreeData>();
			for (Object objTmp : trees) {
				Object[] objTmpArray = (Object[]) objTmp;
				if(objTmpArray.length>2) {
					zTreeData = new ZTreeData();
					zTreeData.setId(StringUtils.handNull(objTmpArray[3]));
					try { 
						zTreeData.setpId(StringUtils.handNull(objTmpArray[4]));
					} catch (Exception e) {
						zTreeData.setpId("0");
					}
					zTreeData.setName(StringUtils.handNull(objTmpArray[5]));
					int checkedPosition = objTmpArray.length - 1;
					if(isAsync) {
						Object parentObj = objTmpArray[objTmpArray.length-1];
						int count = Integer.parseInt(StringUtils.handNumNull(parentObj));
						zTreeData.setIsParent((count>0?true:false));
						checkedPosition = checkedPosition - 1;
					} else {
						zTreeData.setIsParent(isParent(trees, StringUtils.handNull(objTmpArray[0])));
					}
					if(StringUtils.isNotEmpty(StringUtils.handNull(objTmpArray[checkedPosition]))){
						if(StringUtils.isInteger(StringUtils.handNull(objTmpArray[checkedPosition]))) {
							boolean is = YesNoType.YES.getIndex() == Integer.parseInt(StringUtils.handNull(objTmpArray[checkedPosition]));
							zTreeData.setChecked(is);
						} else {
							zTreeData.setChecked(true);
						}
					} else {
						zTreeData.setChecked(false);
					}
					convert(zTreeData, objTmpArray);
					zTreeDatas.add(zTreeData);
				} 
			}//for
			afterConvert(zTreeDatas);
			zTreeData = null;
		}
		return zTreeDatas;
	}
	
	/**
	 * 判断是否为父节点
	 * @param trees 树形数据列表
	 * @param id 要判断父节点的ID
	 * @return 如果是父节点；则返回：true；否则返回：false
	 */
	protected boolean isParent(List<Object> trees,String id) {
		boolean is = false;
		if(StringUtils.isNotEmpty(id) && trees != null && trees.size()>0 ) {
			for (Object objTmp : trees) {
				Object[] objTmpArray = (Object[]) objTmp;
				if(StringUtils.handNull(objTmpArray[1]).equals(id)) {
					is = true;
					break;
				}
			}
		}
		return is;
	}
	
	/**
	 * 根据具体的显示内容把后续的数组对象转化为ZTreeData对象
	 * @param zTreeData ZTreeData对象
	 * @param objTmpArray 数组
	 */
	protected abstract void convert(ZTreeData zTreeData, Object[] objTmpArray);
	
	/**
	 * 对最终结果列表在进行转换处理(具体由子类实现)
	 * @param zTreeDatas zTree数据结构
	 */ 
	protected abstract void afterConvert(List<ZTreeData> zTreeDatas);
	
}
